package com.addzero.web.ui.system.hooks

import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import com.addzero.web.ui.hooks.tree.NodeTypes
import com.addzero.web.ui.hooks.tree.TreeNavigation
import com.addzero.web.ui.hooks.tree.TreeNode

/**
 * 通用树形侧边栏组件
 * @param T 树节点数据类型
 * @param data 树形数据列表 (根节点列表)
 * @param currentId 当前选中节点ID
 * @param onNodeSelected 节点选中回调
 * @param getLabel 获取节点标签的函数 (现在使用 node.id)
 * @param getChildren 获取子节点的函数 (现在使用 node.children)
 * @param content 自定义节点内容渲染函数, 接收 TreeNode, 选中状态, 展开状态
 */
@Composable
fun <T> TreeSider(
    data: List<T>,
    currentId: String,
    onNodeSelected: (String) -> Unit,
    getLabel: (T) -> String, // 用于生成 TreeNode 的 ID 和 Label
    getChildren: (T) -> List<T>, // 用于构建 TreeNode 的 children
    content: @Composable (node: TreeNode<T>, isSelected: Boolean, isExpanded: Boolean) -> Unit,
) {
    // 将数据转换为带有层级信息的 TreeNode
    val treeNodes = remember(data) { // Recompute if data changes
        convertToTreeNodes(data, getLabel, getChildren, 0) // Start level at 0
    }

    // 初始展开的节点ID集合 (查找选中节点路径并展开父节点)
    val initialExpandedIds = remember(currentId, treeNodes) { // Recompute if currentId or treeNodes change
        val expandedIds = mutableSetOf<String>()
        
        fun findPathToNode(nodes: List<TreeNode<T>>, targetId: String, currentPath: List<String>): List<String>? {
            for (node in nodes) {
                if (node.id == targetId) {
                    return currentPath + node.id // 找到目标，返回路径
                }
                if (node.children.isNotEmpty()) {
                    val path = findPathToNode(node.children, targetId, currentPath + node.id)
                    if (path != null) {
                        return path // 在子节点中找到，返回路径
                    }
                }
            }
            return null // 在当前分支未找到
        }
        
        val path = findPathToNode(treeNodes, currentId, emptyList())
        if (path != null) {
            // 展开路径上除最后一个节点（即选中节点本身）外的所有节点
            expandedIds.addAll(path.dropLast(1))
        }
        // 如果需要默认展开根节点，可以在这里添加：
        // else { expandedIds.addAll(treeNodes.map { it.id }) }

        expandedIds
    }

    // 使用TreeNavigation组件渲染树形菜单
    TreeNavigation(
        nodes = treeNodes,
        currentSelectedId = currentId,
        initialExpandedIds = initialExpandedIds,
        onNodeSelected = onNodeSelected,
        // 直接传递 3 参数的 content lambda 给 customNodeContent
        customNodeContent = content
    )
}

// 将数据转换为TreeNode，并计算层级
private fun <T> convertToTreeNodes(
    data: List<T>,
    getLabel: (T) -> String,
    getChildren: (T) -> List<T>,
    level: Int // 当前层级
): List<TreeNode<T>> {
    return data.map { item ->
        val childrenData = getChildren(item)
        val nodeId = getLabel(item) // Use getLabel to generate ID
        TreeNode(
            id = nodeId, // 使用 getLabel 的结果作为 ID
            label = nodeId, // 使用 getLabel 的结果作为 Label
            data = item,
            type = if (childrenData.isEmpty()) NodeTypes.FILE else NodeTypes.FOLDER,
            level = level, // 设置当前节点的层级
            // 递归转换子节点，层级加 1
            children = convertToTreeNodes(childrenData, getLabel, getChildren, level + 1)
        )
    }
}
